Spring Cloud Alibaba 从入门到放弃

作者: 李多多 日期: 2020-08-16
Spring Cloud
Spring Cloud Alibaba 从入门到放弃

@TOC

Spring Cloud Alibaba简介

Spring Cloud Alibaba 致力于提供微服务开发一站式解决方案。此项目包括开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,你只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里云中间件来迅速搭建分布式应用系统。

SpringCloud Alibaba 和 Spring Cloud 搭配方案

  • SpringCoud Alibaba-Nacos:注册中心(服务发现 / 注册)
  • SpringCoud Alibaba-Nacos:配置中心(动态配置管理)
  • SpringCoud Alibaba-Sentinel:服务容错(限流、降级、熔断)
  • SpringCoud Alibaba-Seata:原 Fescar,即分布式解决方案
  • SpringCoud-Ribbon:负载均衡
  • SpringCoud-Feign:声明式 HTTP 客户端(调用远程服务)
  • SpringCoud-Gateway:API 网关(webflux 编程模式)
  • SpringCoud-Sleuth:调用链监控

Spring Cloud Alibaba主要功能

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

相关组件

  • Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • Sentinel:阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

开源地址:https://github.com/alibaba/spring-cloud-alibaba/

1. Nacos 简介

Nacos 主要提供了服务发现、服务配置以及服务管理的功能。以下援引自 **官方网站**:

基本特征:

  • 服务发现
  • 动态配置
  • 动态 DNS 服务
  • 服务及元数据管理

在这里插入图片描述

1.1 Nacos 安装 + 配置中心

  • Docker 安装
  • 下载编译好的安装包

首先下载安装包:https://github.com/alibaba/nacos/releases/download/1.4.0/nacos-server-1.4.0.tar.gz

然后解压,如果是 windows 直接在 bin 目录下双击 startup.cmd 启动。

如果是Linux, bin 目录下执行命令: sh startup.sh -m standalone

注意:系统一定要配置好 jdk ,测试 java 和 javac 两个命令要存在!

Nacos 启动成功后,浏览器输入: http://192.168.1.132:8848/nacos 就能看到启动页面了。登录页面的默认用户名/密码都是 nacos ,登录后如下图:

在这里插入图片描述 配置中心:类似于 Spring Cloud Config ,点击服务端配置——> 配置管理——> 配置列表——> 点击+,这里主要配置三个东西, Data ID、Group 以及配置的内容。

Data Id 的格式是:

${prefix}- ${spring.profile.active}. ${file-extension}

  1. prefix 默认为 spring.application.name 的值;
  2. spring.profile.active 即为当前环境对应的 profile;
  3. file-exetension 为配置内容的数据格式。

    :当 - spring.profile.active 为空 / 未填写时,相对应的连接符 - 也将不存在 (省略),dataId 的拼接格式变成 ${prefix}. ${file-extension};
    file-exetensio可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型

最终格式:${spring.application.name}- ${spring.profile.active}. ${spring.cloud.nacos.config.file-extension}

然后在新添加一个配置如下:

在这里插入图片描述

接下来创建新的 Spring Cloud Alibaba 项目进行测试,添加如下依赖:
在这里插入图片描述
然后,新建 bootstrap.properties,配置如下:

spring.application.name=nacos
spring.cloud.nacos.server-addr=192.168.1.132:8848
spring.cloud.nacos.config.file-extension=properties

添加测试 Controller:

@RestController
@RefreshScope //动态刷新
public class HelloController {

@Value("${name}")
String name;

@GetMapping("/hello")
public String hello(){
return name;
}
}

最后启动项目,浏览器访问: http://localhost:8080/hello ,就会获取到在页面配置的内容,如下:

在这里插入图片描述

1.2 注册中心

Navos 也可做注册中心,代替 Eureka。创建 Spring Boot 项目(此时相当于provider),添加依赖:
在这里插入图片描述
添加如下配置:

spring.application.name=nacos01
spring.cloud.nacos.discovery.server-addr=192.168.1.132:8848

提供测试 Controller :

@RestController
public class HelloController {

@Value("${server.port}")
Integer port;//添加端口号,测试集群

@GetMapping("/hello")
public String hello(){
return "hello:"+port;
}
}

将项目打包,启动两个实例。

java -jar nacos01-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar nacos01-0.0.1-SNAPSHOT.jar --server.port=8081

启动成功后,这时刷新,服务已经注册上来了。如图:

在这里插入图片描述

provider 已经创建成功,再创建一个 consumer ,配置基本与 nacos01 一致。

在这里插入图片描述
配置如下:

spring.application.name=nacos02
spring.cloud.nacos.discovery.server-addr=192.168.1.132:8848

server.port=8083

开启负载均衡:

@SpringBootApplication
public class Nacos02Application {

public static void main(String[] args) {
SpringApplication.run(Nacos02Application.class, args);
}

@Bean
@LoadBalanced //开启负载均衡
RestTemplate restTemplate(){
return new RestTemplate();
}

}

创建测试 Controller:

@RestController
public class HelloController {

@Autowired
RestTemplate restTemplate;

@GetMapping("/hello")
public String hello(){
return restTemplate.getForObject("http://nacos01/hello",String.class);
}
}

启动 naxos02 ,然后可以看到已经注册挤进去了。

在这里插入图片描述
然后浏览器不停刷新访问:http://localhost:8083/hello,达到负载均衡效果。

在这里插入图片描述
在这里插入图片描述

总结:Nacos 做为配置中心的话比 Spring Cloud Config 方便一些,作为注册中心与 Eureka、Consul 区别不大。

2. Sentinel

  • 使用场景丰富
  • 有完备的实时监控
  • 广泛的开源生态

Sentinel 整体上可以分为两个核心部分:

下载完后启动服务,浏览器访问如下则成功。

在这里插入图片描述

2.2 Sentinel 应用

1.新建一个 Spring Boot 项目,添加 Sentinel 依赖,如下:

在这里插入图片描述
创建成功后,配置 Sentinel 控制台地址:

spring.application.name=sentinel
spring.cloud.sentinel.transport.dashboard=localhost:8080

server.port=8081

再创建一个测试 Controller:

@RestController
public class HelloController {

@GetMapping("/hello")
public String hello(){
return "hello sentinel";
}
}

测试如下:
在这里插入图片描述
然后刷新 sentinel 控制台页面,发现它的信息已经注册上去了,如下图:

在这里插入图片描述
2. 接下来做一个流量控制的测试,先配置如下信息,每秒处理5个请求:
在这里插入图片描述

写一个测试类,这里假设一次来25个请求:

@SpringBootTest
class SentinelApplicationTests {

@Test
void contextLoads() {
RestTemplate restTemplate = new RestTemplate();
for (int i = 0; i < 25; i++) {
String forObject = restTemplate.getForObject("http://localhost:8081/hello", String.class);
System.out.println(forObject+":"+new Date());
}
}
}

启动测试类,打印日志,每秒处理5个请求:

在这里插入图片描述

总结: 这里的流控规则比之前的 Resilience4j 较为方便一些,只需针对接口进行配置即可。

2.2.1 Nacos 中配置流控规则

接上文代码,整合配置中心,添加依赖至 sentinel 服务中:

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--关联 nacos 与 sentinel -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.7.1</version>
</dependency>

修改配置文件:

spring.cloud.sentinel.datasource.ds.nacos.server-addr=192.168.1.132:8848
spring.cloud.sentinel.datasource.ds.nacos.data-id=sentinel-rule
spring.cloud.sentinel.datasource.ds.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow

由于 nacos 要把数据告诉 sentinel,然后它去创建限流规则,那么服务需要注册到 nacos 上去。那么参考之前的,新建 bootstrap.properties 配置文件注册到 nacos,添加如下:

spring.cloud.nacos.config.server-addr=192.168.1.132:8848

访问nacos 控制台:http://192.168.1.132:8848/nacos,新建一个配置,如下:
在这里插入图片描述

[
{
"resource": "/hello", //限流的接口
"limitApp": "default", //流控针对的调用源【有手机的、小程序的等;default表示不限制】
"grade": 1, //【阈值类型】0:表示并发线程数;1:QPS
"count": 5, // 单机阈值
"clusterMode": false, //是否是集群模式
"strategy": 0, //流控模式
"controlBehavior": 0 //流控效果
}
]

添加完后启动 sentinel 服务,此时刷新 sentinel 管理页面没有数据。如下:

在这里插入图片描述

然后访问 http://127.0.0.1:8081/hello,如下:

在这里插入图片描述

然后再次刷新 sentinel 管理页面,发现数据已经注册上来了,这条数据就是刚才配置的信息,如下图:

在这里插入图片描述

在这里插入图片描述

以上就是 nacos 与 sentinel 的结合使用。

项目案例地址https://github.com/astronger/springcloud-simple-samples